<?php
abstract class Fs2PreHandler extends SzAbstractCtrlPreProcessHandler
{
    /**
     * @var int $userId
     */
    private $userId = false;

    /**
     * Parse param request name from inputted $_REQUEST['*'].
     *
     * @param array $inputs params inputted from $_REQUEST['*']
     * @return array | boolean $reqName
     */
    protected function parseReqName($inputs)
    {
        if (!is_array($inputs)) {
            return false;
        }

        /**
         * 获取第一个请求结构：
         * array(
         *     $reqName,
         *     array(
         *         $reqParam1,
         *         $reqParam2,
         *         ...
         *     )
         * )
         */
        $input = array_shift($inputs);
        if (!is_array($input)) {
            return false;
        }

        return SzUtility::explodeWithTrim('.', $input[0]);
    }

    /**
     * Parse param user id from inputted $_REQUEST['*'].
     *
     * @param array $inputs params inputted from $_REQUEST['*']
     * @return int $userId
     */
    protected function parseUserId($inputs)
    {
        if ($this->userId) {
            return $this->userId;
        }

        if (!SzParam::getReqParam('*')
            && class_exists('SzPublish')) {
            $platform = SzConfig::get()->loadAppConfig('app', 'PLATFORM');

            // find ported player id
            if ($platformId = SzPublish::get(false)->getPlatformId()) {
                $this->userId = ModuleSnsFactory::init(null, $platform)->portPlayerUserId($platformId, false);
                return SzSystem::handleIdentify(null, $this->userId);
            }
        }

        if (!is_null(SzParam::getReqParam('userId'))
            && $this->userId = SzParam::getReqParam('userId')) {
            return SzSystem::handleIdentify(null, $this->userId);
        }

        if (!is_array($inputs)) {
            return false;
        }

        /**
         * 获取第一个请求结构：
         * array(
         *     $reqName,
         *     array(
         *         $reqParam1,
         *         $reqParam2,
         *         ...
         *     )
         * )
         */
        $input = array_shift($inputs);
        if (!is_array($input)) {
            return false;
        }
        $reqName = SzUtility::explodeWithTrim('.', $input[0]); // 'Gm.Index' => array('Gm', 'Index')

        // 如果是中间件接口请求，不需要获取userId
        // 如果是游戏调用平台api的请求，不需要获取userId
        if (strtolower($reqName[0]) == 'middleware'
            || strtolower($reqName[0]) == 'platform') {
            return false;
        }

        $this->userId = SzSystem::handleIdentify(array($input));

        return $this->userId;
    }

    /**
     * 判断是否需要执行handler
     * @param $inputs
     * @param array $exclude
     * @return bool
     */
    protected function checkHandleExclude($inputs, $exclude = [])
    {
        $reqName = $this->parseReqName($inputs);
        if (!$reqName) {
            return true;
        }

        $module = isset($reqName[0]) ? lcfirst($reqName[0]) : '';
        $action = isset($reqName[1]) ? lcfirst($reqName[1]) : '';

        if (SzUtility::checkArrayKey($module, $exclude) && in_array($action, $exclude[$module])) {
            return true;
        }

        $exclude = json_decode(GameConst::HANDLE_CONFIG_VERIFY_TOKEN_EXCLUDE, true);
        if (SzUtility::checkArrayKey($module, $exclude) && in_array($action, $exclude[$module])) {
            return true;
        }
        return false;
    }
}